#ifndef __OPERATE_H__
#define __OPERATE_H__


#define OP_NAME_SIZE 64
#define OP_BUF_SIZE 1024


/*命令种类*/
typedef enum{
    CMD_FALSE,                      //（用于标记错误指令）
    CMD_LS,                         //ls指令
    CMD_CD,                         //cd指令
    CMD_PUTS,                       //上传指令
    CMD_GETS,                       //下载指令
    CMD_RM,                         //删除服务器上的文件
    CMD_MKDIR,                      //创建目录
    CMD_PWD,                        //显示目前所在路径
    CMD_LOGIN,                      //登录
    CMD_REGISTER                    //注册
}CMD_TYPE;


/*用户信息*/
typedef struct{
    char name[OP_NAME_SIZE];        //用户姓名
    char path[OP_BUF_SIZE];         //当前路径
    bool login;                     //登录状态
    int fd_net;                     //该用户的socket连接的文件描述符号
}User;

/*命令信息*/
typedef struct{
    CMD_TYPE type;                  //指令类型
    char cmd_arg[OP_BUF_SIZE];      //指令参数
}Cmd;

/*文件信息*/
typedef struct{
    char file_name[OP_NAME_SIZE];   //文件名   
    unsigned file_size;             //文件大小
}File;

/*需要传输的结构体*/
typedef struct client_s{
    User user;                      //用户信息
    Cmd cmd;                        //命令信息
    File file;                      //文件信息
}Client;


/*================================ 函数声明 ================================*/
/*根据指令类型调用不同的函数*/
int handleCli(
    Client *cli                     //Client结构体指针
);

/*处理指令参数中的 /.. */
int handleArg(
    char *cli_path,                 //客户端当前路径
    char *arg                       //待处理参数，（传入传出）            
); 


/*ls指令，成功返回0，失败返回-1*/
int op_ls(
    Client *cli                     //Client结构体指针
);

/*cd指令，成功返回0，失败返回-1*/
int op_cd(
    Client *cli                     //Client结构体指针
);

/*puts指令，成功返回0，失败返回-1*/
int op_puts(
    Client *cli                     //Client结构体指针
);

/*gets指令，成功返回0，失败返回-1*/
int op_gets(
    Client *cli                     //Client结构体指针
);

/*gets指令，成功返回0，失败返回-1*/
int op_mkdir(
    Client *cli                     //Client结构体指针
);

/*rm指令，成功返回0，失败返回-1*/
int op_rm(
    Client *cli                     //Client结构体指针
);

/*login指令，成功返回0，失败返回-1*/
int op_login(
    Client *cli                     //Client结构体指针
);

/*register指令，成功返回0，失败返回-1*/
int op_register(
    Client *cli                     //Client结构体指针
);


#endif
